/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxServidorTcp;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import javax.swing.DefaultListModel;
import pkg1ifxArchivos.cifxLogs;

/**
 *
 * @author strailaparicio
 */
public class cifxServiConsol extends cIfxServidor{
        //Consola
        //Consola
    private boolean trabajarconconsola=false;
    private javax.swing.JList lstMensajes;
    private javax.swing.JList lstAgentes;
    private cifxAgentes oagentes;
    private javax.swing.JTextField txtBuscar;
    private DefaultListModel olistademensajes;
    private DefaultListModel olmagentes;
    protected cifxClieConConsol[] oclientescon = new cifxClieConConsol[0];//=new cIfxClientesCon[150];
    protected cifxClieConConsol[] oagentesTMP;


    public cifxServiConsol(int npuerto,cifxLogs log) throws IOException
    {
        super(npuerto, log);
        
    }
    
    @Override
    public void run() {
        Socket onuevoskt=null;
        
        //int nindice=0;
        
        try
        {
          serversocket = new ServerSocket(npuerto);

        }catch(IOException ioe)
        {
            //System.err.println("001IFX-Error (No puedo abri el puerto"+npuerto+")");
            olog.outMensaje("cifxServiConsol.run(): ERROR No puedo abrir el puerto :"+npuerto);
            olog.outMensaje("cifxServiConsol.run(): ERROR IOException :"+ioe.getMessage());
            System.exit(-1);
        }

        //this.ofrmgral = ofrmppal;
        //ofrmgral.setIconRed(3);
        try {
            while(conectado)
            {

                    //new cIfxClientesCon(serversocket.accept(),ofrmppal).start();
                onuevoskt= serversocket.accept();
                //Asigno un time out de 10 segundos a las conexiones
                onuevoskt.setSoTimeout(ntimeout);
                activarConexionCliente(onuevoskt);

               
            }
            if(serversocket != null)
                serversocket.close();
        } 
        catch(SocketTimeoutException tex)
        {
            olog.outMensaje("cifxServiConsol.run(): Time out :"+tex.getMessage());
        }
        catch (IOException ex) {
                //Logger.getLogger(cIfxServidor.class.getName()).log(Level.SEVERE, null, ex);
            olog.outMensaje("cifxServiConsol.run(): ERROR IOException :"+ex.getMessage());
        }
    }
    
    private synchronized void activarConexionCliente(Socket onuevoskt)
    {
        try
        {
            cIfxClientesCon[] occontmp=new cIfxClientesCon[0];
            occontmp=new cIfxClientesCon[oclientescon.length];
            CopiarArregloCon(occontmp,oclientescon);
            //occontmp= CopiarArregloCon(oclientescon); 

            oclientescon=new cifxClieConConsol[oclientescon.length+1];
            //if(occontmp.length>0)
            CopiarArregloCon(oclientescon,occontmp);
            //oagentes=CopiarArregloCon(occontmp);

            if((oclientescon.length-1)<0)
            {
                nindice=0;
            }
            else
            {
                nindice=(oclientescon.length-1);
            }

            oclientescon[nindice]= new cifxClieConConsol(onuevoskt,this,olog);
            oclientescon[nindice].setLlave(nagentesllave);
            if(trabajarconconsola)
            {
                oclientescon[nindice].setTrabajaConsola(trabajarconconsola);
                oclientescon[nindice].setAgentes(oagentes);
                oclientescon[nindice].setTxtBuscar(txtBuscar);
                oclientescon[nindice].setJlistAgentes(lstAgentes);
                oclientescon[nindice].setJlistMensajes(lstMensajes);
                oclientescon[nindice].setListModelAgentes(olmagentes);
                oclientescon[nindice].setListModelMensajes(olistademensajes);
            }
            oclientescon[nindice].start();
            
            //ncontadorclientes++;
            nagentesllave++;
        }catch(Exception err)
        {
            olog.outMensaje("cifxServiConsol.activarConexionCliente() ERROR :" + err.getMessage());
        }
        
    }
    
    @Override
    public synchronized void QuieroSalir(int ncual)
    {
        int z=0;
        int i=0;
        //Al fin no entendi por que putas va con -1
        //oagentesTMP = new cIfxClientesCon[oclientescon.length-1];
        try
        {
        olog.outMensaje("cifxServiConsol.QuieroSalir(): Tamaño arreglo : "+oclientescon.length);

        
        oagentesTMP = new cifxClieConConsol[oclientescon.length-1];
        
        for(i=0; i<oclientescon.length;i++)    
        {
            if( oclientescon[i].getLlave() != ncual)
            {
                oagentesTMP[z] = oclientescon[i];
                z++;
                
            }
            
        }
        oclientescon= new cifxClieConConsol[oagentesTMP.length];
        
        CopiarArregloCon(oclientescon,oagentesTMP); 
        }
        catch(Exception err)
        {
            olog.outMensaje("cifxServiConsol.QuieroSalir(): ERROR : "+err.toString());
            //olog.outMensaje("cIfxServidor.QuieroSalir(): ERROR : "+err.getMessage());
            olog.outMensaje("cifxServiConsol.QuieroSalir(): Tamaño arreglo : "+oclientescon.length);
            olog.outMensaje("cifxServiConsol.QuieroSalir(): (i) : "+i);
            olog.outMensaje("cifxServiConsol.QuieroSalir(): (z) : "+z);
            olog.outMensaje("cifxServiConsol.QuieroSalir(): ERROR DETALLE : "+err.getMessage());
        }
        
    }
    
    @Override
    public cifxClieConConsol[] getAgentesConectados()
    {
        return oclientescon;
    }
        //Pa la consola
    public void setTrabajaConsola(boolean dato)
    {
        trabajarconconsola=dato;
    }
    public void setJlistAgentes(javax.swing.JList lst)
    {
       lstAgentes=lst; 
    }
    public javax.swing.JList getJlistAgentes()
    {
        return lstAgentes;
    }
    public void setListModelMensajes(DefaultListModel lmdl)
    {
        olistademensajes=lmdl;
    }
    
    public DefaultListModel getListModelMensajes()
    {
        return olistademensajes;
    }
    
    public void setListModelAgentes(DefaultListModel lmdl)
    {
        olmagentes=lmdl;
    }
    
    public DefaultListModel getListModelAgentes()
    {
        return olmagentes;
    }
    public void setAgentes(cifxAgentes agentes)
    {
        oagentes=agentes;
    }
    public cifxAgentes getAgentes()
    {
        return oagentes;
    }
    
    public void setTxtBuscar(javax.swing.JTextField txt)
    {
        txtBuscar=txt;
    }
    public javax.swing.JTextField getTxtBuscar()
    {
        return txtBuscar;
    }
    public void setJlistMensajes(javax.swing.JList lst)
    {
       lstMensajes=lst; 
    }
    public javax.swing.JList getJlistMensajes()
    {
        return lstMensajes;
    }
    //
    
}
